package com.jhy.game;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;

/**
 * @Author: JiangHeYuan
 * GamePanel 继承了JPanel以后才具备面板功能，该方法就属于图形版的main方法
 */
public class GamePanel extends JPanel {
    //初始化蛇的长度
    int length;
    //定义两个数组存放蛇的x,y坐标
    int[] snakeX = new int[200];
    int[] snakeY = new int[200];
    //游戏的状态：开始，暂停
    boolean isStart = false;
    //加入一个定时器
    Timer timer;
    //定义食物的坐标
    int foodX;
    int foodY;
    //定义蛇的存活状态
    boolean isLive = true;
    //定义积分
    int score = 0;
    //定义蛇的行走方向
    String direction;
    public void init(){
        //初始化蛇的长度
        length = 3;
        //初始化蛇头坐标
        snakeX[0] = 175;
        snakeY[0] = 275;
        //初始化第一节身体坐标
        snakeX[1] = 150;
        snakeY[1] = 275;
        //初始化第二节身体坐标
        snakeX[2] = 125;
        snakeY[2] = 275;
        //初始化方向
        direction = "R";
        //初始化食物的坐标
        foodX = 300;
        foodY = 200;
    }
    public GamePanel(){
        init();
        //将焦点定位在当前的面板上
        this.setFocusable(true);
        //加入监听
        this.addKeyListener(new KeyAdapter() {//匿名内部类
            @Override
            public void keyPressed(KeyEvent e) {//监听键盘按下的操作
                super.keyPressed(e);
                int key = e.getKeyCode();
                if (key == KeyEvent.VK_SPACE){
                    if (isLive == false){
                        init();
                        isLive = true;
                        score = 0;
                    }else {//小蛇没有死亡情况下
                        isStart = !isStart;//取反
                        repaint();//重新绘制
                    }

                }
                //监听向上的箭头
                if (key == KeyEvent.VK_UP){
                    direction = "U";
                }
                //监听向下的箭头
                if (key == KeyEvent.VK_DOWN){
                    direction = "D";
                }
                //监听向左的箭头
                if (key == KeyEvent.VK_LEFT){
                    direction = "L";
                }
                //监听向右的箭头
                if (key == KeyEvent.VK_RIGHT){
                    direction = "R";
                }

            }
        });
        //对定时器初始化
        timer = new Timer(100, new ActionListener() {
            /**
             * ActionListener 是事件监听
             * 相当于每100ms监听一下你是否发生了一个动作
             * 具体动作放入actionPerformed
             */
            @Override
            public void actionPerformed(ActionEvent e) {
                if (isStart == true && isLive == true){
                    //游戏是开始的状态，蛇才动
                    //从最后一节身子开始动
                    for (int i = length - 1; i > 0; i--) {
                        snakeX[i] = snakeX[i-1];
                        snakeY[i] = snakeY[i-1];
                    }
                    //动头
                    if ("R".equals(direction)){
                        snakeX[0] +=25;
                    }
                    if ("L".equals(direction)){
                        snakeX[0] -=25;
                    }
                    if ("U".equals(direction)){
                        snakeY[0] -=25;
                    }if ("D".equals(direction)){
                        snakeY[0] +=25;
                    }

                    //防止蛇跑出界面
                    if (snakeX[0] > 750){
                        snakeX[0] = 25;
                    }
                    if (snakeX[0] < 25){
                        snakeX[0] = 750;
                    }
                    if (snakeY[0] < 100){
                        snakeY[0] = 725;
                    }
                    if (snakeY[0] > 725){
                        snakeY[0] = 100;
                    }
                    //检测碰撞的动作：
                    //食物的坐标和蛇的坐标是否重合
                    if (snakeX[0] == foodX && snakeY[0] == foodY){
                        //蛇的长度加一
                        length++;
                        //食物改变坐标,随机生成坐标，必须是25的倍数，并且在矩形游戏框内
                        foodX = ((int)(Math.random()*30)+1)*25;//[25,750] [1,30]*25
                        foodY = (new Random().nextInt(26)+4)*25;//[100,725] [4,29]*25
                        score +=10;
                    }
                    //死亡判断
                    for (int i = 1; i < length; i++) {
                        if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]){
                            isLive = false;
                        }
                    }
                    repaint();//重绘
                }
            }
        });
        timer.start();
    }
    /**
     *paintComponent 该方法就属于图形版的main方法
     * 自动调用
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        //填充背景颜色
        this.setBackground(new Color(33, 212, 230));
        //画头部的图片
        /**
         * this 指的是当前面板
         * g 指的是使用的画笔
         * x,y 对于坐标
         */
        Images.headerImg.paintIcon(this,g,10,10);
        //画矩形之前改画笔颜色
        g.setColor(new Color(217, 240, 204, 163));
        //画一个矩形
        g.fillRect(10,70,770,685);
        //画蛇
        //画蛇头
        if ("R".equals(direction)){
            Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if ("L".equals(direction)){
            Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if ("U".equals(direction)){
            Images.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if ("D".equals(direction)){
            Images.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
//        //第一节身子
//        Images.bodyImg.paintIcon(this,g,snakeX[1],snakeY[1]);
//        //画第二节身子
//        Images.bodyImg.paintIcon(this,g,snakeX[2],snakeY[2]);
        for (int i = 1; i < length; i++) {
            Images.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]);
        }

        //如果游戏暂停，中间有提示
        if (isStart == false){
            //画一个文字
            g.setColor(new Color(35, 87, 185, 255));
            //字体，加粗，字号
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            //画文字：文字内容，x坐标,y坐标
            g.drawString("点击空格开始游戏",250,330);
        }
        //画食物
        Images.foodImg.paintIcon(this,g,foodX,foodY);
        //画积分
        //画一个文字
        g.setColor(new Color(236, 233, 228, 255));
        //字体，加粗，字号
        g.setFont(new Font("微软雅黑",Font.BOLD,25));
        //画文字：文字内容，x坐标,y坐标
        g.drawString("积分："+score,650,50);

        //画作者
        //画一个文字
        g.setColor(new Color(229, 10, 92, 255));
        //字体，加粗，字号
        g.setFont(new Font("微软雅黑",Font.BOLD,25));
        //画文字：文字内容，x坐标,y坐标
        g.drawString("蒋贺元",530,50);

        //画入死亡状态
        if (isLive == false){
            //画一个文字
            g.setColor(new Color(216, 13, 64, 255));
            //字体，加粗，字号
            g.setFont(new Font("微软雅黑",Font.BOLD,20));
            //画文字：文字内容，x坐标,y坐标
            g.drawString("小蛇死亡，游戏结束，点击空格重新开始游戏",200,330);
        }
    }
}
